基本的C++03枚举类型只是一个具有奇特名称的整数值,因此我希望按值传递它....出于这个原因,我还期望boost::call_traits::param_type与T=SomeEnum确定最有效的传球方式T是按值(value)。从boost文档中查看CallTraits:Definesatypethatrepresentsthe"best"waytopassaparameteroftypeTtoafunction.当我使用boost::call_traits::param_type时与T=SomeEnum它确定SomeEnum应该通过引用传递。我也期待C++11classenums也
使用C++11的强类型enum,可以像这样声明一个类的成员枚举:classX{public:enumclassE;};enumclassX::E{a,b};但是,当使X成为类模板时:templateclassX{public:enumclassE;};templateenumclassX::E{a,b};gcc4.7.2和clang3.0都分别提示“错误:‘enumX::E’是枚举模板[-pedantic]”和“错误:枚举不能是模板”。我认为相关的标准部分(事实上,这个问题源于此)是§14模板,其中第一段指出:Thedeclarationinatemplate-declarations
我应该如何在C++11中循环枚举类?我希望我仍然不必添加END的最终枚举值,但我也无法使基于范围的循环工作。 最佳答案 如果你真的需要遍历枚举类并且你想避免添加特殊的END符号,你可以为此目的定义你自己的特征。templatestructEnumTraits;enumclassE{V1,V2,V3};enumclassF{X1,X2,X3};templatestructEnumTraits{staticconstexprELAST=E::V3;};templatestructEnumTraits{staticconstexprFLA
我应该如何更改下面的代码,以便Arrayarray;就足够了SIZE是从枚举中自动推导出来的?即使枚举发生变化,也保证它包含SIZE指的是正确的尺寸。templateclassArray{public:int&operator[](Enumindex){returnarray[index];}private:intarray[N];};enumIndex{X,Y,SIZE};intmain(){Arrayarray;array[X]=1;return0;}更新:至于“Array意味着您正在创建一个Type对象数组”(Jerry)和“类模板的名称有点误导”(Nawaz):实际上我正在创建
我一直在将C++类型安全伪枚举的可怕困惑重构为新的C++0x类型安全枚举,因为它们方式更具可读性。无论如何,我在导出类中使用它们,所以我明确标记它们要导出:enumclass__attribute__((visibility("default")))MyEnum:unsignedint{One=1,Two=2};用g++编译它会产生以下警告:typeattributesignoredaftertypeisalreadydefined这看起来很奇怪,因为据我所知,该警告旨在防止实际错误,例如:class__attribute__((visibility("default")))MyCla
我知道可以编写一个“寄存器”宏,将它们的值映射到它们的字符串表示形式。然而,C++11中是否有一些新的魔力使得无需宏和任何注册样板成为可能?为了说清楚,我希望能够打印枚举变量的标识符,例如:enumDays{Sunday,Monday,Tuesday};autod=Days::Sunday;std::cout应该输出Days::Sunday 最佳答案 不,这真的不可能。您需要宏(最好)或扩展编译器以获得更多技巧(您可以使用插件或MELT扩展GCC以提供特殊的_my_enum_name_builtin函数,但我认为这不是一个好方法主意
我在C++11中工作,包括一个在C++03中实现的h文件。在我包含的h文件中,定义了一个枚举Foo。我想在code.h中声明一个转发到它并在code.cpp中使用它:标题.h:enumFoo{A=1};代码.h:enumFoo:int;//alsotried:unsignedint,long,short,unsignedshort,char,unsignedcharvoidbar(Foofoo);代码.cpp:#includeheader.hvoidbar(Foofoo){}这是我在编译时遇到的错误(测试了g++4.8.5和g++5.3.1):Infileincludedfromcod
我在某个.h文件中声明了一个枚举:typedefenum{NONE,ONE,TWO,THREE}MYENUM;在单独的.cpp中我不能这样做:externenumMYENUM;//worksexternMYENUMTWO;//makessence,TWOisnotanINSTANCEofMYENUM...如果不包括声明枚举的整个header,如何做到这一点? 最佳答案 您不能使用不完整的类型。您只能传递指向它的指针。这是因为在类型完成之前,编译器不知道它有多大。OTOH指针是数据指针的大小,无论它指向什么类型。对于不完整的类型,您不
有没有办法重载转换运算符以在两个枚举之间进行转换?在我的代码中有enumdevStatus{NOT_OPERATING,INITIALISING,DEGRADED,NORMAL};enumdataStatus{UNAVAILABLE=1,DEGRADED,NORMAL}其中NOT_OPERATING和INITIALISING映射到UNAVAILABLE;DEGRADED和NORMALmap直接穿过。这些由外部接口(interface)固定。我正在寻找一种在devStatus和dataStatus之间进行转换的方法,并且希望能够编写如下内容:devStatusdevSts;getDevi
我正在尝试实现一个enum类,它的行为类似于C++11中引入的类(具有类型安全等),但它的行为也像一个真实的类(带有构造函数、方法等)。为了这样做,我保持内部enum匿名:这有副作用,为了保持m_value作为private成员变量,我必须添加一个名为_的static成员变量,如下所示:#include#includeclassState{public:staticenum{UNKNOWN,STARTED,STOPPED}_;private:usingType=decltype(_);Typem_value;public:constexprState(Typevalue=UNKNOWN